[数据平台]02 数据仓库之离线-Hive 二

Hive产生背景及Hive是什么、为什么要使用Hive及Hive发展历程、Hive和Hadoop对比、Hive体系架构以及部署架构、Hive和RDBMS的对比、Hive单机环境搭建、Hive执行方式

Posted by 李玉坤 on 2018-04-09

Hive产生背景及Hive是什么

Hive产生的背景

  • MapReduce编程的不便性
  • HDFS上的文件缺少Schema

Hive是什么

  • 由Facebook开源,最初用于解决海量结构化的日志数据统计问题
  • 构建在Hadoop之上的数据仓库
  • Hive定义了一种类SQL查询语言: HQL(类似SQL但不完全相同)
  • 通常用于进行离线数据处理(刚开始采用MapReduce )
  • 底层支持多种不同的执行引擎;
    【Hive底层的执行引擎有:MapReduce、Tez、Spark】
    【Hive on MapReduce,Hive on Tez,Hive on Spark】
  • 支持多种不同的压缩格式、存储格式以及自定义函数
    【压缩:GZIP、LZO、Snappy、BZIP2..】
    【存储:TextFile、SequenceFile、RCFile、ORC、Parquet】
    【UDF:自定义函数】
  • Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库。

为什么要使用Hive及Hive发展历程

为什么要使用Hive

  • 简单、容易上手(提供了类似SQL查i言HQL)
  • 为超大数据集设计的计算/存储扩展能力(MR计算, HDFS存储)
  • 统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据)

Hive发展历程
官方版本更新详细目录
http://hive.apache.org/downloads.html

Hive在Hadoop生态系统的位置
在HDFS和Yarn之上的

Hive VS Hadoop

Hive数据存储:Hive的数据是存储在HDFS上的,Hive的表是对HDFS上数据的映射。

Hive元数据存储:元数据存储一般在外部关系库(Mysql),与Presto Impala等共享。

Hive语句的执行过程:将HQL转换为MapReduce任务运行。

Hive VS 数据库

hive执行流程

Hive体系架构及部署架构

Hive体系架构


第一行:hive访问方式shell以及Thrift/JDBC
第二行:元数据管理(Metastore);
Drive中首先解析SQL(SQL Parser)生成逻辑执行计划,然后对逻辑执行计划进行优化(Query Optimizer),最后生成物理执行计划(Physical Plan其中包括序列化反序列化和UDF函数(SerDes和UDFs)),生成最终的执行引擎(Execution)提交到MapReduce
第三行:元数据存放的位置(MySQL);
提交到计算引擎(MapReduce)的输入输出-HDFS、HBase等

部署架构–测试环境

部署架构–生产环境


其中MySQL、ResourceManage、NameNode都要主从设备;
Hive只需要在集群中装一个或者两个作为客户端使用即可

Hive单机环境搭建

  1. Hive下载:http://archive.cloudera.com/cdh5/cdh/5/
    wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz

  2. 解压

    1
    tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app/
  3. 配置
    系统环境变量(~/.bahs_profile)

    1
    2
    export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
    export PATH=$HIVE_HOME/bin:$PATH

    实现安装一个mysql, yum install xxx,或者tar包安装

    在conf下对hive-env.sh配置

    1
    2
    3
    4
    5
    # Set HADOOP_HOME to point to a specific hadoop install directory
    HADOOP_HOME=/home/hadoop/app/hadoop

    # Hive Configuration Directory can be controlled by:
    export HIVE_CONF_DIR=/home/hadoop/app/hive/conf

    在conf下新建hive-site.xml配置 hive-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/sparksql?createDatabaseIfNotExist=true&amp;useSSL=false</value>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root</value>
    </property>
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/hive/warehouse</value>
    </property>
    <property>
    <name>hive.exec.scratchdir</name>
    <value>/hive/tmp</value>
    </property>
    <property>
    <name>hive.querylog.location</name>
    <value>/hive/log</value>
    </property>
    <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    </property>
    <property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    </property>
  4. 拷贝mysql驱动到$HIVE_HOME/lib/
    初始化数据库 schematool -initSchema -dbType mysql

  5. 启动hive: $HIVE_HOME/bin/hive
    如果要连接hiveserver2 需要分别启动

    1
    2
    hive --service metastore
    hive --service hiveserver2

    【注意】Hive启动时报错“which: no hbase in ”

在Hive的所在的机器上添加Hbase的环境变量即可
1、编辑

1
2
export HBASE_HOME=/opt/module/hbase-2.2.1
export PATH=$PATH:$HBASE_HOME/bin

2、环境变量生效

1
source ~/.bahs_profile

Hive执行方式

1
2
3
4
5
6
7
8
9
10
直接执行:
hive -f test.sql
hive -e "sql语句"

进入客户端:
hive

通过jdbc客户端访问:
beeline
!connect jdbc:hive2://localhost:10000

注意:通过jdbc客户端访问需要修改以下配置

  1. 修改hadoop配置文件hdfs-site.xml,表示启用webhdfs
    1
    2
    3
    4
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
  2. 修改hadoop配置文件core-site.xml,表示设置可访问的用户及用户组
    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>hadoop.proxyuser.XXX.hosts</name>
    <value>*</value>
    </property>
    <property>
    <name>hadoop.proxyuser.XXX.groups</name>
    <value>*</value>
    </property>
  3. 重启hdfs
  4. 重新启动
    1
    2
    hive --service metastore
    hive --service hiveserver2
  5. 访问
    1
    2
    3
    beeline

    !connect jdbc:hive2://localhost:10000